24860
14562
Non sono sicuro di come tradurre davvero la mia domanda in parole, quindi lasciami provare a spiegarla con un esempio:
Diciamo che il mio programma si imbatte in un comportamento strano in un'azione specifica. Ho già trovato del codice che è la causa di questo strano comportamento. Quando disabilito questa sequenza non mi imbatto in questo comportamento. Sfortunatamente, ho bisogno di questo codice perché qualcos'altro non funziona allora.
Quindi, quello che farò dopo è capire perché qualcosa sta andando diversamente quando quell'estratto di codice è attivo.
Per capire meglio cosa sta succedendo, a volte voglio eseguire l'intera azione incluso il "codice errato" e talvolta senza. Quindi posso confrontare il risultato, ad esempio cosa succede nell'interfaccia utente o cosa restituisce la mia funzione.
Il primo approccio che mi viene in mente è eseguire il mio programma con il codice abilitato, fare quello che voglio, quindi fermare il programma, commentare il codice, ricompilare ed eseguire di nuovo. Ehm ... sembra stupido. Soprattutto se devo riattivare quel codice per vedere un'altra volta l'altro comportamento, e poi spegnerlo, riaccenderlo, spegnerlo e così via.
Non è un'opzione per me utilizzare i punti di interruzione e influenzare l'ordine delle istruzioni o modificare i valori in modo da eseguire o meno le istruzioni if, i cicli for ecc.
Eseguo il debug di un comportamento critico di temporizzazione e quando fermo il programma il tempo cambia in modo significativo. Pertanto, il primo punto di interruzione che posso impostare deve essere alla fine dell'azione. 1
Mi aspetto che appaia un suggerimento o un'altra finestra che viene "soppressa" quando il focus è dato a VS. Pertanto, non posso assolutamente utilizzare alcun punto di interruzione. Né all'inizio né alla fine dell'azione 1
Esiste una tecnica in Visual Studio 2012 che mi consenta di contrassegnare questo codice come facoltativo e posso decidere se voglio o meno eseguire questa sequenza di codice prima di eseguire l'azione? Penso a qualcosa come se (vero | falso) a un livello più alto.
Non sto cercando una soluzione in cui ho bisogno di rieseguire il mio programma più volte. In quel caso potrei ancora fare il semplice approccio di commentare semplicemente il codice con #if false.
1 Nota che, ovviamente, posso impostare un punto di interruzione quando ho bisogno di esaminare una variabile specifica in una certa posizione (se non ho scritto il valore in output) ma disattiverò nuovamente i punti di interruzione per eseguire l'intera azione in uno partire. 
Nel debugger di Visual Studio è possibile impostare un punto di interruzione proprio davanti al "codice in questione". Quando il codice si ferma a quel punto, puoi scegliere di lasciarlo continuare oppure puoi fare clic con il pulsante destro del mouse su qualsiasi altra riga e selezionare Imposta istruzione successiva.
È un'opzione un po 'strana, ma l'ho apprezzata.
|
L'unica opzione a cui riesco a pensare è aggiungere qualcosa alla tua interfaccia utente che appare solo durante il debug, dandoti la possibilità di includere / escludere le operazioni in questione.
Già che ci sei, potresti voler abilitare il ripristino dell'applicazione a uno "stato noto" anche dall'interfaccia utente.
|
Penso a qualcosa come se (vero | falso) a un livello più alto.
Perché "a un livello superiore"? Perché non usare esattamente questo?
Volete che un pezzo di codice a volte venga eseguito, a volte no, e l'interruttore dovrebbe essere cambiato in fase di esecuzione, non in fase di compilazione - questo ovviamente porta a
se (condizione)
{
// codice in gioco
}
Il problema qui è il tipo di condizione che utilizzerai: forse una variabile che hai impostato su true nella versione di rilascio del tuo codice e su false a volte nella versione di debug. Forse il valore è preso da un file di configurazione, forse da una variabile d'ambiente, magari calcolato da qualche tipo di logica nel tuo programma, qualunque cosa e quando vuoi.
EDIT: potresti anche introdurre una variabile booleana nel tuo codice per condition, inizializzarla su true per impostazione predefinita e cambiarne il valore usando il debugger quando vuoi.
|
Le direttive del preprocessore potrebbero essere ciò che stai cercando. Sono bit di codice che il compilatore deve eseguire, identificabili iniziando con un carattere # (e stilisticamente, per impostazione predefinita, non seguono il modello di rientro del codice, ma risiedono sempre saldamente sul bordo sinistro dell'editor ):
#define INCLUDE_DODGY_CODE
public void MyMethodWithDodgyBits () {
#if INCLUDE_DODGY_CODE
myDodgyMethod ();
#finisci se
myOkMethod ();
}
In questo caso, se è stato incluso #define INCLUDE_DODGY_CODE, la chiamata myDodgyMethod () verrà compilata nel programma. Altrimenti, la chiamata verrà saltata dal compilatore e semplicemente non esisterà nel tuo binario.
|
Ci sono un paio di opzioni per il debug come richiesto.
Visual Studio ha una serie di opzioni per navigare direttamente nel codice. È possibile utilizzare la funzione Imposta istruzione successiva per passare direttamente a una determinata istruzione. È inoltre possibile modificare direttamente i valori tramite la finestra immediata, l'osservazione rapida e il suggerimento che si posiziona sulle variabili durante il debug.
Visual Studio ha anche la possibilità di riprodurre la cronologia di esecuzione. Dai un'occhiata a IntelliTrace per iniziare. Può essere utile quando si hanno più aree di preoccupazione che interagiscono e generano la condizione di errore.
È inoltre possibile racchiudere le sezioni di codice all'interno di blocchi condizionali e impostare le variabili condizionali in modo appropriato. Potrebbe essere durante il debug o potresti passare i parametri attraverso un file di configurazione. L'utilizzo dei controlli condizionali può essere più semplice rispetto all'esecuzione manuale del codice se sono presenti numerose istruzioni che si desidera escludere.
|
A volte dipende dalla versione di VS e dalla lingua, ma puoi tranquillamente modificare il codice (per commentarlo o racchiuderlo in un grande #ifdef 0), quindi premere alt + F10 e il compilatore si ricompilerà, ricollegherà e continuerà l'esecuzione come se non ci avessi mai giocato.
Ma mentre funziona magnificamente in VC ++ (da VS v6 IIRC), C # può avere problemi: trovo (con VS2010) che non posso modificare e continuare in questo modo con funzioni contenenti dichiarazioni lambda (principalmente linq) e codice a 64 bit mai usato per fare anche questo. Tuttavia, vale la pena sperimentarlo perché a volte è davvero utile.
|
Ho lavorato su applicazioni che hanno codice opzionale utilizzato solo per il debug che non dovrebbe apparire nell'ambiente di produzione. Questo segmento di codice opzionale è stato il più facile da controllare utilizzando un file di configurazione poiché non richiedeva una ricompilazione per essere modificato.
Una tale correzione potrebbe non essere la fine del tutto per il tuo risultato finale, ma potrebbe aiutarti a superarla finché non viene trovata una soluzione. Se hai più sezioni opzionali che devono essere testate in combinazione, questo stile di correzione potrebbe richiedere più chiavi nel file di configurazione, il che potrebbe essere uno svantaggio e un problema di cui tenere traccia.
|
La tua domanda non è esattamente chiara, motivo per cui ci sono così tante risposte che ritieni non valide. Potresti considerare di riformularlo se nessuno sembra in grado di rispondere alla domanda.
Con il rischio di dare un'altra risposta non valida aggiungerò qualche input su come ho affrontato il problema in passato.
Il modo più semplice è inserire qualsiasi codice opzionale all'interno di
#if DEBUG
// Codice opzionale qui
#finisci se
In questo modo, quando si esegue in modalità di debug il codice viene implementato e quando si esegue in modalità di rilascio non lo è. Per passare da uno all'altro è necessario fare clic su un pulsante.
Ho anche risolto lo stesso problema in modo simile con un semplice flag:
bool runOptionalCode = false;
poi
if (runOptionalCode)
{
// Inserisci qui il codice opzionale
}
Ancora,passare da una modalità all'altra richiede la modifica di una parola, quindi è un compito semplice. Lo dici nella tua domanda, ma lo scarti per motivi che non sono chiari. Come ho detto, è necessario uno sforzo minimo per passare da uno all'altro.
Se è necessario apportare modifiche tra il codice mentre è in esecuzione, il modo migliore è utilizzare un elemento dell'interfaccia utente o una sequenza di tasti che modifica il flag menzionato nell'esempio sopra. A seconda dell'applicazione, tuttavia, potrebbe essere più faticoso di quanto valga la pena. In passato ho scoperto che quando ho un listener di chiavi già implementato come parte del progetto, avere un paio di pressioni di tasti decide se eseguire il mio codice di debug (opzionale) funziona meglio. In un'applicazione senza ascoltatori chiave preferisco restare con uno dei metodi precedenti.
|
la tua risposta
StackExchange.ifUsing ("editor", function () {
StackExchange.using ("externalEditor", function () {
StackExchange.using ("snippets", function () {
StackExchange.snippets.init ();
});
});
}, "frammenti di codice");
StackExchange.ready (function () {
var channelOptions = {
tag: "" .split (""),
id: "1"
};
initTagRenderer ("". split (""), "" .split (""), channelOptions);
StackExchange.using ("externalEditor", function () {
// Devo attivare l'editor dopo gli snippet, se gli snippet sono abilitati
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using ("snippets", function () {
createEditor ();
});
}
altro {
createEditor ();
}
});
function createEditor () {
StackExchange.prepareEditor ({
useStacksEditor: false,
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
suffisso: "",
imageUploader: {
brandingHtml: "Powered by \ u003ca href = \" https: //imgur.com/ \ "\ u003e \ u003csvg class = \" svg-icon \ "width = \" 50 \ "height = \" 18 \ "viewBox = \ "0 0 50 18 \" fill = \ "none \" xmlns = \ "http: //www.w3.org/2000/svg \" \ u003e \ u003cpath d = \ "M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.62993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.72543 4.9162889 464562 46.72531 4.9162889 4.6456221 4.6531 4.65.69562 4.65.69562 C4562.625.6531.49562 C4562.425.6531 4.6531.49562 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \ "/ \ u003e \ u003cpath d = \" M32.492 10.1419C32.418 14.695.0 37439 C32.418 14.695.0 14.6954C32.418 14.695.0 14.6954 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455.5 C35.820 35 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \ "/ \ u003e \ u003cpath fill-rule = \" evenodd \ "clip-rule = \" evenodd \ "d = \ "M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.6.7331C28.9913 4.6624978 4.533 4.56087 4.560.856087 4.6624978 4.560.856087 4.533.456087 4.560.87.533.4556087 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1252.70 28.121 12.8346C28.1252.70 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.9924 7,928 7,928 7,066 24 7,928 7,066 24 7,928 7,966 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \ "/ \ u003e \ u003cpath d = \" M16.8045 11.9512.25 17.89.89.662 C16.39.89.62.635.562 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34331 4.62866 8.578066 7.932 4.978.479 4.762 4.678.532.762.762.762.762.762.762.762.762.762.762.762.762.762.762.762.762.362.762.762.762.762.762. 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.51093 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.51093 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.51093 6.98817.862 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \ "/ \ u003e \ u003cpath d = \ "M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 3.3962C2.8165798 13.896213.2535 3.31675 11.9512V6.59049Z \ "/ \ u003e \ u003cpath d = \" M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 1.7234 2.8715 2.8729 1.7234 2.8729 1.7234 2.8715 2.8729 1.7234 2.8715 2.8729 1.7234 2.8734 2.8729 1.7234 0.400291Z \ "fill = \" # 1BB76E \ "/ \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e",
contentPolicyHtml: "Contributi utente concessi in licenza con \ u003ca href = \" https: //stackoverflow.com/help/licensing \ "\ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \" https://stackoverflow.com / legal / content-policy \ "\ u003e (content policy) \ u003c / a \ u003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
, immediatamenteShowMarkdownHelp: true, enableSnippets: true
});
}
});
Grazie per aver contribuito con una risposta a Stack Overflow!
Assicurati di rispondere alla domanda. Fornisci dettagli e condividi la tua ricerca!
Ma evita ...
Chiedere aiuto, chiarimenti o rispondere ad altre risposte.
Fare dichiarazioni basate su opinioni; supportali con riferimenti o esperienza personale.
Per saperne di più, consulta i nostri suggerimenti su come scrivere ottime risposte.
Bozza salvata
Bozza scartata
Registrati o fai il login
StackExchange.ready (function () {
StackExchange.helpers.onClickDraftSave ('# login-link');
});
Registrati utilizzando Google
Iscriviti utilizzando Facebook
Iscriviti utilizzando e-mail e password
Invia
Pubblica come ospite
Nome
E-mail
Obbligatorio, ma mai mostrato
StackExchange.ready (
funzione () {
StackExchange.openid.initPostLogin ('. New-post-login', 'https% 3a% 2f% 2fstackoverflow.com% 2fquestions% 2f19425104% 2fcan-i-mark-some-code-as-optional-while-debugging-in visual-studio-2012% 23new-answer ',' question_page ');
}
);
Pubblica come ospite
Nome
E-mail
Obbligatorio, ma mai mostrato
Pubblica la tua risposta
Scartare
Facendo clic su "Pubblica la tua risposta", accetti i nostri termini di servizio, politica sulla privacy e politica sui cookie
Non è la risposta che stai cercando? Sfoglia altre domande contrassegnate come debugging visual-studio o fai la tua domanda.